package com.example.softpart.magicAPiCustomFunction;

import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import cn.hutool.core.util.StrUtil;
import cn.hutool.cron.CronUtil;
import cn.hutool.cron.task.Task;
import cn.hutool.db.Db;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.config.MagicFunction;
import org.ssssssss.magicapi.core.service.MagicAPIService;
import org.ssssssss.script.annotation.Comment;
import org.ssssssss.script.annotation.Function;
import org.ssssssss.script.functions.DateExtension;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.*;


/**
 * 测试自定义函数
 */
@Component  //注入到Spring容器中
public class timeFunction implements MagicFunction {


    @Autowired
    private static MagicAPIService service;


    // 脚本中直接使用 now();
    @Function
    @Comment("取当前时间")
    public static Date now() {
        return new Date();
    }

    // 脚本中使用 date_format(now())
    @Function
    @Comment("日期格式化")
    public static String date_format(@Comment("目标日期") Date target) {
        return target == null ? null : DateExtension.format(target, "yyyy-MM-dd HH:mm:ss");
    }

    // 脚本中使用 date_format(now(),'yyyy-MM-dd')
    @Function
    @Comment("日期格式化")
    public static String date_format(@Comment("目标日期") Date target, @Comment("格式") String pattern) {
        return target == null ? null : DateExtension.format(target, pattern);
    }

    // 脚本中直接使用ifnull() 调用
    @Function
    @Comment("判断值是否为空")
    public static Object ifnull(@Comment("目标值") Object target, @Comment("为空的值") Object trueValue, @Comment("不为空的值") Object falseValue) {
        return target == null ? trueValue : falseValue;
    }

    // 计算临时权限过期的时间
    @Function
    @Comment("计算过期时间")
    public static Object getReleaseRoleTime(@Comment("当前时间") Date getRoleTime, @Comment("权限时常") LinkedHashMap timeLength) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy MM dd HH:mm:ss");
        HashMap map = (HashMap) timeLength;
        long releaseRoleTimeStap = getRoleTime.getTime() + (1000 * 60 * (int) map.get("timeLength"));
        Date releaseRoleTime = new Date(releaseRoleTimeStap);
        return releaseRoleTime;
    }

    @Function
    @Comment("临时权限过期")
    public static void timeOut(@Comment("过期时间") LinkedHashMap timeLength, @Comment("获得临时权限的用户id") String userId) {

        HashMap map = (HashMap) timeLength;
        //计算过期时间
        Date dateNow = DateUtil.date();
        DateTime date = DateUtil.offsetMinute(dateNow, (int) map.get("timeLength"));

        //秒 分 时 日期 月份  周（使用?与日期互斥）年份
        String CornTemplate = "0 {} {} {} {} ? {}";
        String str = StrUtil.format(CornTemplate, DateUtil.minute(date), DateUtil.hour(date, true), DateUtil.dayOfMonth(date), DateUtil.month(date) + 1, DateUtil.year(date));

        //设置定时任务
        CronUtil.schedule(str, new Task() {
            @Override
            public void execute() {
                Console.log("更新临时权限状态为过期");
                //更新临时权限状态为过期
                try {
                    Db.use().execute("update  temporary_role set state = ?,release_role_time = ? where get_role_user_id = ?", 2, date, userId);
                } catch (SQLException e) {
                    e.printStackTrace();
                }

                //过期踢出用户
                Console.log("过期踢出用户" + userId);
                StpUtil.kickout(userId);
            }
        });
        try {
            CronUtil.start(true);
        } catch (Exception exception) {
            Console.log(exception + "已经开启定时任务");
        }
    }

}